package com.mysher.devlib.uvc;

import com.mvcframework.mvccamera.IOperateListener;
import com.mvcframework.mvccamerabase.CameraAttributes;
import com.mvcframework.mvccamerabase.Format;
import com.mvcframework.mvccamerabase.FormatType;
import com.mysher.devlib.uvc.renderer.YuvGLSurfaceView;

public interface UvcCameraDev {

    /**
     * 打开摄像头
     *
     * @param iOperateListener 操作结果回调 ,其中需要usb权限
     */
    void openCamera(IOperateListener iOperateListener);

    /**
     * 获取所有图像的格式以及分辨率
     */
    Format[] getAllFormats();

    /**
     * 获取该图像格式的相关分辨率fps等
     *
     * @param type 出图格式
     * @return 该出图格式的分辨率等参数.如果不支持或者摄像头未打开返回null
     */
    Format getFormat(FormatType type);

    /**
     * 设置YuvGLSurfaceView.绘制nv12.必须要decode =true
     *
     * @param yuvGLSurfaceView
     */
    void setPreviewGLSurfaceView(YuvGLSurfaceView yuvGLSurfaceView);

    /**
     * 开始预览
     *
     * @param resolution      分辨率
     * @param formatType      出图格式
     * @param operateListener 操作回调
     */
    void startPreview(Format.Resolution resolution, FormatType formatType, IOperateListener operateListener);

    /**
     * 关闭预览
     *
     * @param operateListener 操作回调
     */
    void stopPreview(IOperateListener operateListener);

    /**
     * 关闭设备
     *
     * @param operateListener 操作回调
     */
    void closeDevice(IOperateListener operateListener);

    /**
     * 设置usb camera的pu xu相关参数
     */
    void setCameraAttributesValue(CameraAttributes cameraAttributes, int value);

    /**
     * 获取usb camera的pu xu相关参数
     */
    CameraAttrInfo[] getCameraAttributesValues();

    /**
     * 重置pu xu的参数
     *
     * @param cameraAttributes pu xu 名称
     */
    void resetCameraAttributes(CameraAttributes cameraAttributes);

    boolean isOpen();

    boolean isPreview();

    boolean isNativeOpen();

    /**
     * 获取当前预览的分辨率
     */
    Format.Resolution getPreviewSize();

    /**
     * 设置mjpeg的加速预览,仅仅在图像格式为mjpeg 情况有效
     */
    void setMjpegLevel(int mjpegLevel);

    /**
     * 设置预览回调
     *
     * @param mListener 图像预览回调
     */
    void setPreviewListener(PreviewListener mListener);

    /**
     * 设置预览生命周期
     *
     * @param mListener 预览的生命周期
     */
    void setPreviewStateListener(PreviewStateListener mListener);


    /**
     * 是否解码预览..默认为true
     *
     * @param isDecode
     */
    void setDecode(boolean isDecode);


    /**
     * 获取设备的sn号
     * 目前实现的机器不多,需要max适配,可能返回为null
     */
    String getSn();

}
